package com.qf.spring003.utils;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MyProxyFactory {
    public static Object getProxy(Object target){

        // 获取类加载器对象的方式，在任何class对象上调用getClassLoader方法即可
        // 类加载器可以将 字节数组（复合java规范的字节数组） 转换为 class 对象
       // final ClassLoader classLoader = target.class.getClassLoader();
        ClassLoader classLoader = target.getClass().getClassLoader();

        // 获取 原始业务类实现了哪些接口的写法如下
        final Class<?>[] interfaces = target.getClass().getInterfaces();

        // 创建包含了辅助功能的 InvocationHandler
        InvocationHandler h = new InvocationHandler() {

            /**
             * 该方法什么时候被调用的？
             * @param proxy 动态代理对象本身
             * @param method 代表在动态代理对上上调用了哪个方法
             * @param args 代表在动态代理对象上调用方法时传递的参数
             * @return
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // 添加辅助功能
                final long start = System.currentTimeMillis();
                // 让原来的核心业务对象继续被执行
                final Object result = method.invoke(target, args);
                // 添加辅助功能
                final long end = System.currentTimeMillis();
                System.out.println("消耗的时间为:"+(end-start));
                return result;
            }
        };
        // 注意，包路径  java.lang.reflect.Proxy
        Object o = Proxy.newProxyInstance(classLoader, interfaces, h);
        return o;
    }
}
